package com.hxexp.weixin.common.security;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * AES算法加密，传输，解密过程示例(AES可以使用128、192、和256位密钥，并且用128位分组加密和解密数据)
 *
 * @author steven-pan
 * @author li.jiang
 */
public final class AESHelper {

    private static final Logger LOGGER = LoggerFactory.getLogger(AESHelper.class);
    private static final String CHARSET_NAME = "UTF-8";
    private static final String ALGORITHM = "AES";
    private static Cipher cipher = null; // 私鈅加密对象Cipher

    static {
        try {
            cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        } catch (NoSuchAlgorithmException e) {
            LOGGER.error(e.getMessage(), e);
        } catch (NoSuchPaddingException e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

    private AESHelper() {
    }
    /**
     * 加密
     *
     * @param message 文本内容
     * @param password 密钥
     * @return 加密数据
     */
    public static byte[] encrypt(String message, String password) {
        try {
            /* AES算法 */
            SecretKey secretKey = new SecretKeySpec(password.getBytes(), ALGORITHM);// 获得密钥
            /* 获得一个私鈅加密类Cipher，DESede-》AES算法，ECB是加密模式，PKCS5Padding是填充方式 */
            cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 设置工作模式为加密模式，给出密钥

            return cipher.doFinal(message.getBytes(CHARSET_NAME)); // 正式执行加密操作
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return new byte[0];
    }
    /**
     * 加密
     * @param text 文本内容
     * @param password 密钥
     * @return 密文
     */
    public static String encryptString(String text, String password) {
        byte[] cipherBytes = encrypt(text, password);
        return Base64.encodeBase64String(cipherBytes);
    }
    /**
     * 解密
     *
     * @param message 密文字节数据
     * @param password 密钥
     * @return 明文字符串
     * @throws Exception
     */
    public static String decrypt(byte[] messageBytes, String password) {
        String result = "";
        try {
            /* AES算法 */
            SecretKey secretKey = new SecretKeySpec(password.getBytes(), ALGORITHM);// 获得密钥
            cipher.init(Cipher.DECRYPT_MODE, secretKey); // 设置工作模式为解密模式，给出密钥
            byte[] resultBytes = cipher.doFinal(messageBytes);// 正式执行解密操作
            result = new String(resultBytes, CHARSET_NAME);
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return result;
    }
    /**
     * 解密
     * @param ciphertext 密文
     * @param password 密钥
     * @return 明文
     */
    public static String decryptString(String ciphertext, String password) {
        byte[] cipherBytes = Base64.decodeBase64(ciphertext);
        return decrypt(cipherBytes, password);
    }
    /**
     * 去掉加密字符串换行符
     *
     * @param str
     * @return
     */
    public static String filter(String str) {
        String output = "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            int asc = str.charAt(i);
            if (asc != 10 && asc != 13) {
                sb.append(str.subSequence(i, i + 1));
            }
        }
        output = new String(sb);
        return output;
    }

}
